package com.jty.lib_base.base

// import me.jessyan.autosize.AutoSizeConfig
import android.app.Activity
import android.app.Application
import android.content.ContextWrapper
import android.graphics.Color
import android.os.Bundle
import androidx.core.content.ContextCompat
import com.alibaba.android.arouter.launcher.ARouter
import com.blankj.utilcode.util.LogUtils
import com.blankj.utilcode.util.Utils
import com.bumptech.glide.Glide
import com.jty.lib_base.R
import com.jty.lib_base.api.ApiService
import com.jty.lib_base.di.allModule
import com.jty.lib_base.oss.UploadOss
import com.kongzue.dialogx.DialogX
import com.kongzue.dialogx.dialogs.CustomDialog
import com.kongzue.dialogx.style.MaterialStyle
import com.orhanobut.logger.AndroidLogAdapter
import com.orhanobut.logger.BuildConfig
import com.orhanobut.logger.Logger
import com.scwang.smart.refresh.footer.ClassicsFooter
import com.scwang.smart.refresh.header.MaterialHeader
import com.scwang.smart.refresh.layout.SmartRefreshLayout
import com.tencent.bugly.crashreport.CrashReport
import com.tencent.mmkv.MMKV
import me.jessyan.retrofiturlmanager.RetrofitUrlManager
import me.yokeyword.fragmentation.Fragmentation
import org.koin.android.ext.koin.androidContext
import org.koin.android.ext.koin.androidLogger
import org.koin.core.context.startKoin
import org.koin.core.logger.Level


/**
 * author: zhouyh
 * created on: 2021/5/11 3:12 下午
 * description:
 * 这个类具有`open`属性，可以被其他类继承
 */
lateinit var mApplication: Application

open class MyApplication : Application() {

    private var appCount = 0
    override fun onCreate() {
        super.onCreate()
        mApplication = this
        //调试状态下打开log
        if (BuildConfig.DEBUG) {
            ARouter.openLog()
            ARouter.openDebug()
        }
        ARouter.init(this)
        setApplication(this)


        UploadOss.mContext = this

        Logger.addLogAdapter(AndroidLogAdapter())

        //初始化MMKV
        MMKV.initialize(this)

        Fragmentation.builder()
            .stackViewMode(Fragmentation.NONE)  //栈视图模式
            .debug(BuildConfig.DEBUG)
            .install()

        // 屏幕适配
        /*AutoSizeConfig.getInstance().setCustomFragment(true).setBaseOnWidth(false)
            .setExcludeFontScale(true).designHeightInDp = 812*/
        //是否开启日志打印
        LogUtils.getConfig().setLogSwitch(BuildConfig.DEBUG).setConsoleSwitch(BuildConfig.DEBUG)

        //koin依赖注入
        startKoin {
            androidLogger(Level.NONE)
            androidContext(this@MyApplication)
            modules(allModule)
        }

        initDialogX()

//        WhiteboardApi.get()?.init(this)


        //将每个 BaseUrl 进行初始化,运行时可以随时改变 DOMAIN_NAME 对应的值,从而达到切换 BaseUrl 的效果
//        RetrofitUrlManager.getInstance()
//            .putDomain(ApiService.ApiUrl.ROOM_TOKEN_BASE_URL, ApiService.ApiUrl.URL_ROOM_TOKEN)

        /**
         * bugly
         */
        val userStrategy: CrashReport.UserStrategy = CrashReport.UserStrategy(mApplication)
        userStrategy.setCrashHandleCallback(object : CrashReport.CrashHandleCallback() {
            override fun onCrashHandleStart(
                crashType: Int, errorType: String,
                errorMessage: String, errorStack: String,
            ): MutableMap<String, String>? {
                var map = mutableMapOf<String,String>()
                map.put(errorMessage,errorStack)
                return map
            }
            override fun onCrashHandleStart2GetExtraDatas(
                crashType: Int, errorType: String?,
                errorMessage: String?, errorStack: String?,
            ): ByteArray? {
                LogUtils.i("报错打印 onCrashHandleStart2GetExtraDatas")
                return try {
                    "Extra data.".toByteArray(charset("UTF-8"))
                } catch (e: Exception) {
                    null
                }
            }
        })
        CrashReport.initCrashReport(mApplication, userStrategy) //bugly异常上报


    }


    companion object {
        init {
            ClassicsFooter.REFRESH_FOOTER_FINISH = ""
            SmartRefreshLayout.setDefaultRefreshInitializer { _, layout ->
                layout.apply {
                    setEnableOverScrollDrag(true)
                    setEnableScrollContentWhenLoaded(false)
                    setEnableAutoLoadMore(true)
                    setEnableOverScrollBounce(true)
                    setFooterHeight(60f)
                }
            }
            SmartRefreshLayout.setDefaultRefreshHeaderCreator { context, layout ->
                layout.apply {
                    setPrimaryColorsId(R.color.md_theme_green, R.color.white)
                }
                MaterialHeader(context).setColorSchemeColors(
                    ContextCompat.getColor(
                        context,
                        R.color.md_theme_green
                    )
                )
            }
            SmartRefreshLayout.setDefaultRefreshFooterCreator { context, layout ->
                ClassicsFooter(context).setFinishDuration(0)
            }
        }
    }

    private fun setApplication(application: MyApplication) {
        //初始化工具类
        Utils.init(application)
        //注册监听每个activity的生命周期，便于堆栈式管理
        application.registerActivityLifecycleCallbacks(object : ActivityLifecycleCallbacks {
            override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {
                AppManager.instance.addActivity(activity)
            }

            override fun onActivityStarted(activity: Activity) {
                appCount++
//                LogUtils.e("------应用在---started--$appCount")
                if (AppManager.isRunInBackground) {
                    //应用从后台回到前台 需要做的操作
                    AppManager.instance.back2App(activity)
                }
            }

            override fun onActivityResumed(activity: Activity) {
            }

            override fun onActivityPaused(activity: Activity) {
            }

            override fun onActivityStopped(activity: Activity) {
                appCount--
//                LogUtils.e("------应用在---stopped--$appCount")
                if (appCount == 0) {
                    //应用进入后台 需要做的操作
                    AppManager.instance.leaveApp(activity)
                }
            }

            override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) {
            }

            override fun onActivityDestroyed(activity: Activity) {
                AppManager.instance.removeActivity(activity)
            }

        })
    }

    /*public static RefWatcher getRefWatcher(Context context){
        BaseApplication application = (BaseApplication)context.getApplicationContext();
        return application.refWatcher;
    }*/
    private fun initDialogX() {
        DialogX.init(this)

        //开启调试模式，在部分情况下会使用 Log 输出日志信息
        DialogX.DEBUGMODE = true

        //设置主题样式
        DialogX.globalStyle = MaterialStyle.style()

        //设置亮色/暗色（在启动下一个对话框时生效）
        DialogX.globalTheme = DialogX.THEME.LIGHT

        //设置对话框最大宽度（单位为像素）
        //DialogX.dialogMaxWidth = 1920;

        //设置 InputDialog 自动弹出键盘
        //DialogX.autoShowInputKeyboard = true;

        //限制 PopTip 一次只显示一个实例（关闭后可以同时弹出多个 PopTip）
        DialogX.onlyOnePopTip = false

        //设置对话框默认按钮文本字体样式
        //DialogX.buttonTextInfo = (TextInfo);

        //设置对话框默认确定按钮文字样式
        //DialogX.okButtonTextInfo = (TextInfo);

        //设置对话框默认标题文字样式
        //DialogX.titleTextInfo = (TextInfo);

        //设置对话框默认内容文字样式
        //DialogX.messageTextInfo = (TextInfo);

        //设置默认 WaitDialog 和 TipDialog 文字样式
        //DialogX.tipTextInfo = (TextInfo);

        //设置默认输入框文字样式
        //DialogX.inputInfo = (InputInfo);

        //设置默认底部菜单、对话框的标题文字样式
        //DialogX.menuTitleInfo = (TextInfo);

        //设置默认底部菜单文本样式
        //DialogX.menuTextInfo = (TextInfo);

        //设置默认对话框背景颜色（值为ColorInt，为-1不生效）
        DialogX.backgroundColor = Color.WHITE

        //设置默认对话框默认是否可以点击外围遮罩区域或返回键关闭，此开关不影响提示框（TipDialog）以及等待框（TipDialog）
        DialogX.cancelable = false

        //设置默认提示框及等待框（WaitDialog、TipDialog）默认是否可以关闭
        DialogX.cancelableTipDialog = false

        //设置默认取消按钮文本文字，影响 BottomDialog
        //DialogX.cancelButtonText = (String);

        //设置默认 PopTip 文本样式
        //DialogX.popTextInfo = (TextInfo);

        //设置全局 Dialog 生命周期监听器
        //DialogX.dialogLifeCycleListener = (DialogLifecycleCallback);

        //设置 TipDialog 和 WaitDialog 明暗风格，不设置则默认根据 globalTheme 定义
        //DialogX.tipTheme = (THEME);

        //默认 TipDialog 和 WaitDialog 背景颜色（值为 ColorInt，为-1不生效）
        //DialogX.tipBackgroundColor = (ColorInt)
        /**
         * 重写 TipDialog 和 WaitDialog 进度动画颜色，
         * 注意此属性为覆盖性质，即设置此值将替换提示框原本的进度动画的颜色，包括亮暗色切换的颜色变化也将被替代
         * （值为 ColorInt，为-1不生效）
         */
        //DialogX.tipProgressColor = (ColorInt)
        CustomDialog.overrideMaskEnterAnimRes = 0
        CustomDialog.overrideMaskExitAnimRes = 0
    }


    /**
     * 当内存不足时，清理内存
     * lmk机制
     */
    override fun onTerminate() {
        super.onTerminate()
        ARouter.getInstance().destroy()
    }

    override fun onLowMemory() {
        super.onLowMemory()
        Glide.get(this).clearMemory()
    }

    override fun onTrimMemory(level: Int) {
        super.onTrimMemory(level)
        if (level == TRIM_MEMORY_UI_HIDDEN) {
            Glide.get(this).clearMemory()
        }
        Glide.get(this).trimMemory(level)
    }
}

object AppContext : ContextWrapper(mApplication)//ContextWrapper对Context上下文进行包装(装饰者模式)




